#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void PrintPending(sigset_t *pendingptr)
{
    printf("进程[%d], pending: ", getpid());
    for(int i = 31; i >= 1; i--)
    {
        if(sigismember(pendingptr, i))
            std::cout << 1;
        else
            std::cout << 0;
    }
    std::cout << std::endl;
}

void SigHandler(int sig)
{
    std::cout << "信号[" << sig << "]递达" << std::endl;
    // 验证：pending清零时刻--->递达之前
    // sigset_t pending;
    // sigpending(&pending);
    // PrintPending(&pending);

    // 重新发送信号，让其完成默认行为
    signal(sig, SIG_DFL);
    raise(sig);
}

int main()
{
    // 设置block
    sigset_t mask_set, mask_bak;
    sigemptyset(&mask_set);
    sigemptyset(&mask_bak);
    // 屏蔽SIGINT
    sigaddset(&mask_set, SIGINT);
    sigprocmask(SIG_BLOCK, &mask_set, &mask_bak);

    signal(SIGINT, SigHandler);

    // 获取pending并打印
    sigset_t pending;
    int count = 0;
    while(true)
    {
        sigpending(&pending);
        PrintPending(&pending);

        count++;
        // 解除对SIGINT的屏蔽
        if(count == 10)
        {
            std::cout << "解除对SIGINT的屏蔽" <<std::endl;
            sigprocmask(SIG_UNBLOCK, &mask_set, &mask_bak);
            // 或者sigprocmask(SIG_SETMASK, &mask_bak, nullptr);
        }
        sleep(1);
    }

    return 0;
}